# git 基本操作和分支操作

# 一、基本操作

# 1.1 版本控制

首先理解一下版本控制,版本控制是一种记录若干个文件变化内容,以便将来查阅特定版本修订情况的系统。

# 1.2 创建版本库

可以将其理解为一个目录,这个目录里所有文件都可以被管理,所有文件的修改,删除,git 都可以跟踪,以便将来追踪历史,因而也可以还原。


mkdir folderName # 这样就创建了一个 folderName 文件夹

cd folderName # 这样就打开了文件夹

pwd # 显示当前目录
1
2
3
4
5
6

将当前目录变为 git 可管理的仓库

git init
1

在当前文件夹中创建文件,直接新建 txt 文件。

把文件添加到版本库

把文件放到 git  仓库需要两步

git add filename # 包括文件后缀,将文件添加到暂存区。暂存状态指的是文件被 git add 添加到 暂存区(Staging Area),但尚未提交(git commit)的状态。


git commit -m "这里面的内容是说明" # 用命令 git commit 告诉 git,将文件添加到仓库,将暂存区添加到当前分支。
1
2
3
4

查看仓库当前状态

git status
1

查看具体修改的内容

git diff + filename
1

显示提交日志

git log
1

# 1.3 版本相关概念

commit id 不是递增的数字,是根据 SHA1 计算出来的一个非常大的数字,用十六进制表示,每提交一个新版本,git 将其自动串成一条时间线。

HEAD 表示当前版本,HEAD^ 表示当前版本的上一版本,HEAD^^ 表示当前版本的上两版本,往上数 100 个版本呢,不可能写一百个 ^,因此存在另一种方法为 HEAD~100

版本回退

git 内部有一个指向当前版本的 HEAD 指针,回退的时候,指针就指向需要回退的那个版本去了。

git reset --hard HEAD^ # 会退到上一版本
git reset --hard + 版本号 # 就会来到版本号的那个版本
1
2

记录每一次命令

git reflog
1

# 名词解释

Changes to be committed 已暂存状态 还没到分区

modified: readme.txtreadme.txt 这个文件被修改过了

nothing to commit, working tree clean 没有需要提交的

Changes not staged for commit 还没到暂存区

Untracked files 未被添加的文件

Fast-forward 快进模式

工作区: 电脑上能看到的目录。

版本库: 工作区的隐藏目录 .git,这个不是工作区,而是 git 的版本库

暂存区: stage 或者 叫做 index mastergit 为我们自动创建的第一个分支。

# 查看工作区与版本库最新版本的区别

git diff HEAD -- 文件名 # 注意-- 与文件名之间有空格
1

# 提交的理解

第一次修改然后 git add 即将文件添加到暂存区中

第二次修改了然后直接 git commit -m 将暂存区的文件提交到分区里,那么分区里是不会有第二次修改的内容。

为什么呢?因为 git commit -m 是把暂存区里的文件提交到分区里,而第二次修改的内容没有在暂存区里。

# 提交的顺序

  1. 先手动修改文件
  2. 查看当前状态
  3. 查看修改的与之前的版本有何差别
  4. 添加到暂存区
  5. 将暂存区的文件添加到分区

# 丢弃工作区的修改

git checkout -- file # -- 非常重要,不要漏掉
1

这边需要分两种情况

  1. 文件修改后未添加到暂存区中,撤销修改就回到未修改的情况。

  2. 文件修改后并且添加到暂存区后再次修改(第二次修改了),撤销修改就把第二次修改撤销了,回到添加到暂存区的状态。

# 丢弃暂存区的修改

git reset HEAD file 将暂存区的修改撤销掉重新放回工作区,但是工作区现在被修改了,所以我们需要再一次丢弃工作区的修改

git checkout -- file
1

# 删除文件

rm filename # 工作区的删除但是版本库里面还有
1

# 从版本库中删除

git rm test.txt
1

# 从版本库中恢复到工作区

git checkout -- test.txt
git checkout 就是用版本库的内容覆盖工作区的内容。
1
2

# 将本地的仓库与远程的关联

git remote add origin git@github.com:stevenling/learngit.git
1

# 第一次将本地库的内容推送到远程库上

git push -u origin master # master 是当前分支名
1

# 以后本地直接提交

git push origin master
1

# 克隆仓库

需知道仓库的地址,常用。

git clone git@github.com:torvalds/linux.git
1

# 二、分支

# 创建与合并分支

每次提交,git 把它们串成一条时间线,这条时间线就是分支。

目前只有一个主分支,即 master 分支。HEAD 不是指向提交,而是指向 master 分支,master 指向提交,HEAD 指向的就是当前分支。

当我们创建一个新的分支,例如 dev 时,git 新建了一个指针 dev 指向和 master 一样的提交,就是 devmaster 共同指向一个相同的提交,然后让 HEAD 指向 dev,就表示当前分支在 dev 上面了。

从现在开始,对工作区的修改和提交就是针对 dev 分支了,比如新提交一下,dev 指针往前移动一步,master 原地不动。

合并就让 master 指向完成一切操作的 dev 的当前提交。

合并完,也可以删除 dev 分支。

# 创建并切换分支

git checkout -b dev # dev 是分支名

# 相当于以下两条命令
git branch dev # 创建分支
git checkout dev # 切换分支
1
2
3
4
5

# 查看当前分支

git branch # 会列出所有分支,当前分支前面有*号
1

# 合并指定分支到当前分支

git merge dev # dev 是指定分支名
1

# 删除分支

git branch -d dev # dev 是要被删除的分支名
1